package com.xy.lang.util;

import com.xy.lang.domain.KeyValue;
import com.xy.lang.enums.CodeEnum;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Objects;
import java.util.function.Function;

public class EnumUtils {

    /**
     * 通过编码获取枚举实例
     *
     * @param enums
     * @param code
     * @return
     */
    public static <T extends CodeEnum> T getEnum(T[] enums, int code) {
        Objects.requireNonNull(enums);
        for (T e : enums) {
            if(Objects.equals(e.getCode(), code)) {
                return e;
            }
        }
        return null;
    }

    /**
     * 通过编码获取枚举实例
     *
     * @param enums
     * @param code
     * @return
     */
    public static <T extends CodeEnum> T getEnum(T[] enums, Integer code) {
        return getEnum(enums, code == null ? 0 : code.intValue());
    }

    /**
     * 通过编码获取枚举指定的值
     *
     * @param enums
     * @param code
     * @param mapper
     * @param <T>
     * @return
     */
    public static <T> T getValue(CodeEnum[] enums, int code, Function<CodeEnum, T> mapper) {
        Objects.requireNonNull(enums);
        Objects.requireNonNull(mapper);
        for (CodeEnum e : enums) {
            if(Objects.equals(e.getCode(), code)) {
                return mapper.apply(e);
            }
        }
        return null;
    }

    /**
     * 通过编码获取枚举指定的值
     *
     * @param enums
     * @param code
     * @param mapper
     * @param <T>
     * @return
     */
    public static <T> T getValue(CodeEnum[] enums, Integer code, Function<CodeEnum, T> mapper) {
        return getValue(enums, code == null ? 0 : code.intValue(), mapper);
    }

    /**
     * 返回枚举值的key-value键值
     *
     * @param e
     * @param mapper
     * @return
     */
    public static KeyValue<Integer, String> toKeyValue(CodeEnum e,
                                                       Function<CodeEnum, String> mapper) {
        Objects.requireNonNull(e);
        Objects.requireNonNull(mapper);
        return new KeyValue<>(e.getCode(), mapper.apply(e));
    }

    /**
     * 返回枚举值的key-value键值列表
     *
     * @param enums
     * @param mapper
     * @return
     */
    public static List<KeyValue<Integer, String>> toKeyValueList(CodeEnum[] enums,
                                                                 Function<CodeEnum, String> mapper) {
        Objects.requireNonNull(mapper);
        if(Objects.isNull(enums) || enums.length == 0) {
            return Collections.emptyList();
        }
        List<KeyValue<Integer, String>> list = new ArrayList<>();
        for (CodeEnum e : enums) {
            list.add(new KeyValue<>(e.getCode(), mapper.apply(e)));
        }
        return list;
    }

}
